package apis

import (
	"errors"
	"gitee.com/sansaniot/ssiot-core/facade/env"
	"gitee.com/sansaniot/ssiot-core/httpmvc/api"
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"ssdevice/common/utils"
	"ssdevice/internal/device/models"
	"ssdevice/internal/device/models/command"
	"ssdevice/internal/device/models/query"
	"ssdevice/internal/device/service"
)

type DeviceTask struct {
	api.Api
}

// 查询安装包列表
func (e DeviceTask) FindPackageList(c *gin.Context) {
	// 请求参数
	req := query.SysOTAPackageQuery{}
	// 模型
	m := models.SysOTAPackage{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeModel(&m.Model).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 执行
	var result interface{}
	req.LoadUser(c)
	if err, result = m.FindOTAPackageList(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 查询任务列表
func (e DeviceTask) FindTaskList(c *gin.Context) {
	// 请求参数
	req := query.SysBatchTaskQuery{}
	// 模型
	m := models.SysBatchTask{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeModel(&m.Model).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 执行
	var result interface{}
	req.LoadUser(c)
	if err, result = m.FindTaskList(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 查询任务详情设备列表
func (e DeviceTask) FindTaskDeviceList(c *gin.Context) {
	// 请求参数
	req := query.SysTaskDeviceQuery{}
	// 模型
	m := models.SysTaskDevice{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeModel(&m.Model).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 执行
	var result interface{}
	req.LoadUser(c)
	if err, result = m.FindTaskDeviceList(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 查询任务详情设备列表
func (e DeviceTask) FindTaskDeviceCount(c *gin.Context) {
	// 请求参数
	req := query.SysTaskDeviceQuery{}
	// 模型
	m := models.SysTaskDevice{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeModel(&m.Model).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	if len(req.TaskId) == 0 {
		e.Logger.Error(errors.New("taskId 不能为空"))
		e.Fail(0, err.Error())
		return
	}
	// 执行
	result := make(map[string]interface{})
	var countTotal int64
	var countSuccess int64
	var countFailed int64
	var countDoing int64
	var countTimeout int64
	req.LoadUser(c)
	if err, countTotal = m.FindTaskDeviceCount(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	req.Status = "done"
	if err, countSuccess = m.FindTaskDeviceCount(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	req.Status = "failed"
	if err, countFailed = m.FindTaskDeviceCount(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	req.Status = "doing"
	if err, countDoing = m.FindTaskDeviceCount(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	req.Status = "timeout"
	if err, countTimeout = m.FindTaskDeviceCount(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	result["countTotal"] = countTotal
	result["countSuccess"] = countSuccess
	result["countFailed"] = countFailed
	result["countDoing"] = countDoing
	result["countTimeout"] = countTimeout
	// 返回
	e.Ok(result)
}

// 添加升级包
func (e DeviceTask) AddPackage(c *gin.Context) {
	// 请求参数
	req := command.PackageInsertReq{}
	// 业务service
	s := &service.DeviceTask{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetAllModel()
	// 用户信息
	req.LoadUser(c)
	// 执行
	var result models.SysOTAPackage
	if err, result = s.AddPackage(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Data(result)
}

// 编辑升级包
func (e DeviceTask) EditPackage(c *gin.Context) {
	// 请求参数
	req := command.PackageUpdateReq{}
	// 业务service
	s := &service.DeviceTask{}
	// 模型
	otaPackage := &models.SysOTAPackage{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&otaPackage.Model).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetOTAPackageModel(otaPackage)
	// 用户信息
	req.LoadUser(c)
	// 执行
	if err, *otaPackage = s.ModPackage(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 删除安装包
func (e DeviceTask) DeletePackage(c *gin.Context) {
	// 请求参数
	req := command.PackageDeleteReq{}
	// 业务service
	s := &service.DeviceTask{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetAllModel()
	// 用户信息
	req.LoadUser(c)
	// 执行
	if err = s.DelPackage(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 添加任务
func (e DeviceTask) AddBatchTask(c *gin.Context) {
	// 请求参数
	req := command.BatchTaskInsertReq{}
	// 业务service
	s := &service.DeviceTask{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetAllModel()
	// 用户信息
	req.LoadUser(c)
	// 执行
	var result models.SysBatchTask
	if err, result = s.AddBatchTask(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Data(result)
}

// 编辑任务
func (e DeviceTask) EditBatchTask(c *gin.Context) {
	// 请求参数
	req := command.BatchTaskUpdateReq{}
	// 业务service
	s := &service.DeviceTask{}
	// 模型
	batchTask := &models.SysBatchTask{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&batchTask.Model).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetBatchTaskModel(batchTask)
	// 用户信息
	req.LoadUser(c)
	// 执行
	if err, *batchTask = s.ModBatchTask(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 删除任务
func (e DeviceTask) DeleteBatchTask(c *gin.Context) {
	// 请求参数
	req := command.BatchTaskDeleteReq{}
	// 业务service
	s := &service.DeviceTask{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetAllModel()
	// 用户信息
	req.LoadUser(c)
	// 执行
	if err = s.DelBatchTask(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 执行任务
func (e DeviceTask) ExecBatchTask(c *gin.Context) {
	// 请求参数
	req := command.BatchTaskExecReq{}
	// 业务service
	s := &service.DeviceTask{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetAllModel()
	// 用户信息
	req.LoadUser(c)
	// 执行
	if err = s.ExecBatchTask(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 执行任务
func (e DeviceTask) DownLoadFileInfo(c *gin.Context) {
	// 请求参数
	req := command.BatchTaskExecReq{}
	// 业务service
	s := &service.DeviceTask{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}

	prefix := env.ConfigOperator.GetString("service.device.download-prefix")
	url := prefix + "/api/file/download/" + req.Id
	// 执行
	var result map[string]interface{}
	err, result = utils.DownloadFile(url)
	// 返回
	e.Ok(result)
}

// 模板导出
func (e DeviceTask) ExportTemplate(c *gin.Context) {
	req := query.SysBatchTaskQuery{}
	// 业务service
	s := &service.DeviceTask{}
	// 模型
	m := models.SysBatchTask{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeModel(&m.Model).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 注入模型
	s.SetAllModel()
	// 执行
	req.LoadUser(c)
	err = s.ExportSetupTemplate(c, &req)
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	c.Abort()
}

// 批量导入设置数据任务
func (e DeviceTask) ImportSetupData(c *gin.Context) {
	req := query.SysTaskDeviceQuery{}
	// 业务service
	s := &service.DeviceTask{}
	// 模型
	m := models.SysDevSensor{}
	// 上下文
	err := e.MakeContext(c).Bind(&req, binding.FormMultipart).MakeModel(&m.Model).MakeService(&s.Service).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	if len(req.TaskId) == 0 {
		e.Logger.Error(errors.New("taskId 不能为空"))
		e.Fail(0, err.Error())
		return
	}
	// 注入模型
	s.SetAllModel()
	// 执行
	req.LoadUser(c)
	err = s.ImportSetupTask(c, &req)
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}
